

<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
  <meta charset="utf-8">
  
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta name="Description" content="scikit-learn: machine learning in Python">

  
  <title>Maintainer / core-developer information &mdash; scikit-learn 0.22 documentation</title>
  
  <link rel="canonical" href="http://scikit-learn.org/stable/developers/maintainer.html" />

  
  <link rel="shortcut icon" href="../_static/favicon.ico"/>
  

  <link rel="stylesheet" href="../_static/css/vendor/bootstrap.min.css" type="text/css" />
  <link rel="stylesheet" href="../_static/gallery.css" type="text/css" />
  <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" />
<script id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script> 
</head>
<body>
<nav id="navbar" class="sk-docs-navbar navbar navbar-expand-md navbar-light bg-light py-0">
  <div class="container-fluid sk-docs-container px-0">
      <a class="navbar-brand py-0" href="../index.html">
        <img
          class="sk-brand-img"
          src="../_static/scikit-learn-logo-small.png"
          alt="logo"/>
      </a>
    <button
      id="sk-navbar-toggler"
      class="navbar-toggler"
      type="button"
      data-toggle="collapse"
      data-target="#navbarSupportedContent"
      aria-controls="navbarSupportedContent"
      aria-expanded="false"
      aria-label="Toggle navigation"
    >
      <span class="navbar-toggler-icon"></span>
    </button>

    <div class="sk-navbar-collapse collapse navbar-collapse" id="navbarSupportedContent">
      <ul class="navbar-nav mr-auto">
        <li class="nav-item">
          <a class="sk-nav-link nav-link" href="../install.html">Install</a>
        </li>
        <li class="nav-item">
          <a class="sk-nav-link nav-link" href="../user_guide.html">User Guide</a>
        </li>
        <li class="nav-item">
          <a class="sk-nav-link nav-link" href="../modules/classes.html">API</a>
        </li>
        <li class="nav-item">
          <a class="sk-nav-link nav-link" href="../auto_examples/index.html">Examples</a>
        </li>
        <li class="nav-item">
          <a class="sk-nav-link nav-link nav-more-item-mobile-items" href="../getting_started.html">Getting Started</a>
        </li>
        <li class="nav-item">
          <a class="sk-nav-link nav-link nav-more-item-mobile-items" href="../tutorial/index.html">Tutorial</a>
        </li>
        <li class="nav-item">
          <a class="sk-nav-link nav-link nav-more-item-mobile-items" href="../glossary.html">Glossary</a>
        </li>
        <li class="nav-item">
          <a class="sk-nav-link nav-link nav-more-item-mobile-items" href="index.html">Development</a>
        </li>
        <li class="nav-item">
          <a class="sk-nav-link nav-link nav-more-item-mobile-items" href="../faq.html">FAQ</a>
        </li>
        <li class="nav-item">
          <a class="sk-nav-link nav-link nav-more-item-mobile-items" href="../related_projects.html">Related packages</a>
        </li>
        <li class="nav-item">
          <a class="sk-nav-link nav-link nav-more-item-mobile-items" href="../roadmap.html">Roadmap</a>
        </li>
        <li class="nav-item">
          <a class="sk-nav-link nav-link nav-more-item-mobile-items" href="../about.html">About us</a>
        </li>
        <li class="nav-item">
          <a class="sk-nav-link nav-link nav-more-item-mobile-items" href="https://github.com/scikit-learn/scikit-learn">GitHub</a>
        </li>
        <li class="nav-item">
          <a class="sk-nav-link nav-link nav-more-item-mobile-items" href="https://scikit-learn.org/dev/versions.html">Other Versions</a>
        </li>
        <li class="nav-item dropdown nav-more-item-dropdown">
          <a class="sk-nav-link nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">More</a>
          <div class="dropdown-menu" aria-labelledby="navbarDropdown">
              <a class="sk-nav-dropdown-item dropdown-item" href="../getting_started.html">Getting Started</a>
              <a class="sk-nav-dropdown-item dropdown-item" href="../tutorial/index.html">Tutorial</a>
              <a class="sk-nav-dropdown-item dropdown-item" href="../glossary.html">Glossary</a>
              <a class="sk-nav-dropdown-item dropdown-item" href="index.html">Development</a>
              <a class="sk-nav-dropdown-item dropdown-item" href="../faq.html">FAQ</a>
              <a class="sk-nav-dropdown-item dropdown-item" href="../related_projects.html">Related packages</a>
              <a class="sk-nav-dropdown-item dropdown-item" href="../roadmap.html">Roadmap</a>
              <a class="sk-nav-dropdown-item dropdown-item" href="../about.html">About us</a>
              <a class="sk-nav-dropdown-item dropdown-item" href="https://github.com/scikit-learn/scikit-learn">GitHub</a>
              <a class="sk-nav-dropdown-item dropdown-item" href="https://scikit-learn.org/dev/versions.html">Other Versions</a>
          </div>
        </li>
      </ul>
      <div id="searchbox" role="search">
          <div class="searchformwrapper">
          <form class="search" action="../search.html" method="get">
            <input class="sk-search-text-input" type="text" name="q" aria-labelledby="searchlabel" />
            <input class="sk-search-text-btn" type="submit" value="Go" />
          </form>
          </div>
      </div>
    </div>
  </div>
</nav>
<div class="d-flex" id="sk-doc-wrapper">
    <input type="checkbox" name="sk-toggle-checkbox" id="sk-toggle-checkbox">
    <label id="sk-sidemenu-toggle" class="sk-btn-toggle-toc btn sk-btn-primary" for="sk-toggle-checkbox">Toggle Menu</label>
    <div id="sk-sidebar-wrapper" class="border-right">
      <div class="sk-sidebar-toc-wrapper">
        <div class="sk-sidebar-toc-logo">
          <a href="../index.html">
            <img
              class="sk-brand-img"
              src="../_static/scikit-learn-logo-small.png"
              alt="logo"/>
          </a>
        </div>
        <div class="btn-group w-100 mb-2" role="group" aria-label="rellinks">
            <a href="advanced_installation.html" role="button" class="btn sk-btn-rellink py-1" sk-rellink-tooltip="Installing the development version of scikit-learn">Prev</a><a href="index.html" role="button" class="btn sk-btn-rellink py-1" sk-rellink-tooltip="Developer’s Guide">Up</a>
            <a href="plotting.html" role="button" class="btn sk-btn-rellink py-1" sk-rellink-tooltip="Developing with the Plotting API">Next</a>
        </div>
        <div class="alert alert-danger p-1 mb-2" role="alert">
          <p class="text-center mb-0">
          <strong>scikit-learn 0.22</strong><br/>
          <a href="http://scikit-learn.org/dev/versions.html">Other versions</a>
          </p>
        </div>
        <div class="alert alert-warning p-1 mb-2" role="alert">
          <p class="text-center mb-0">
            Please <a class="font-weight-bold" href="../about.html#citing-scikit-learn"><string>cite us</string></a> if you use the software.
          </p>
        </div>
          <div class="sk-sidebar-toc">
            <ul>
<li><a class="reference internal" href="#">Maintainer / core-developer information</a><ul>
<li><a class="reference internal" href="#before-a-release">Before a release</a><ul>
<li><a class="reference internal" href="#preparing-a-bug-fix-release">Preparing a bug-fix-release</a></li>
</ul>
</li>
<li><a class="reference internal" href="#making-a-release">Making a release</a></li>
<li><a class="reference internal" href="#the-scikit-learn-org-web-site">The scikit-learn.org web site</a></li>
<li><a class="reference internal" href="#travis-cron-jobs">Travis Cron jobs</a></li>
<li><a class="reference internal" href="#experimental-features">Experimental features</a></li>
</ul>
</li>
</ul>

          </div>
      </div>
    </div>
    <div id="sk-page-content-wrapper">
      <div class="sk-page-content container-fluid body px-md-3" role="main">
        
  <div class="section" id="maintainer-core-developer-information">
<h1>Maintainer / core-developer information<a class="headerlink" href="#maintainer-core-developer-information" title="Permalink to this headline">¶</a></h1>
<div class="section" id="before-a-release">
<h2>Before a release<a class="headerlink" href="#before-a-release" title="Permalink to this headline">¶</a></h2>
<ol class="arabic">
<li><p>Update authors table:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ cd build_tools; make authors; cd ..
</pre></div>
</div>
<p>and commit.</p>
</li>
<li><p>Confirm any blockers tagged for the milestone are resolved, and that other
issues tagged for the milestone can be postponed.</p></li>
<li><p>Ensure the change log and commits correspond (within reason!), and that the
change log is reasonably well curated. Some tools for these tasks include:</p>
<ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">maint_tools/sort_whats_new.py</span></code> can put what’s new entries into
sections.</p></li>
<li><p>The <code class="docutils literal notranslate"><span class="pre">maint_tools/whats_missing.sh</span></code> script may be used to identify pull
requests that were merged but likely missing from What’s New.</p></li>
</ul>
</li>
</ol>
<div class="section" id="preparing-a-bug-fix-release">
<h3>Preparing a bug-fix-release<a class="headerlink" href="#preparing-a-bug-fix-release" title="Permalink to this headline">¶</a></h3>
<p>Since any commits to a released branch (e.g. 0.999.X) will automatically update
the web site documentation, it is best to develop a bug-fix release with a pull
request in which 0.999.X is the base. It also allows you to keep track of any
tasks towards release with a TO DO list.</p>
<p>Most development of the bug fix release, and its documentation, should
happen in master to avoid asynchrony. To select commits from master for use in
the bug fix (version 0.999.3), you can use:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ git checkout -b release-0.999.3 master
$ git rebase -i 0.999.X
</pre></div>
</div>
<p>Then pick the commits for release and resolve any issues, and create a pull
request with 0.999.X as base. Add a commit updating <code class="docutils literal notranslate"><span class="pre">sklearn.__version__</span></code>.
Additional commits can be cherry-picked into the <code class="docutils literal notranslate"><span class="pre">release-0.999.3</span></code> branch
while preparing the release.</p>
</div>
</div>
<div class="section" id="making-a-release">
<h2>Making a release<a class="headerlink" href="#making-a-release" title="Permalink to this headline">¶</a></h2>
<ol class="arabic">
<li><p>Update docs:</p>
<ul>
<li><p>Edit the doc/whats_new.rst file to add release title and commit
statistics. You can retrieve commit statistics with:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ git shortlog -s 0.99.33.. | cut -f2- | sort --ignore-case | tr &#39;\n&#39; &#39;;&#39; | sed &#39;s/;/, /g;s/, $//&#39;
</pre></div>
</div>
</li>
<li><p>Update the release date in whats_new.rst</p></li>
<li><p>Edit the doc/index.rst to change the ‘News’ entry of the front page.</p></li>
<li><p>Note that these changes should be made in master and cherry-picked into
the release branch.</p></li>
</ul>
</li>
<li><p>On the branch for releasing, update the version number in
sklearn/__init__.py, the <code class="docutils literal notranslate"><span class="pre">__version__</span></code> variable by removing <code class="docutils literal notranslate"><span class="pre">dev*</span></code> only
when ready to release.
On master, increment the verson in the same place (when branching for
release).</p></li>
<li><p>Create the tag and push it:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ git tag -a 0.999

$ git push git@github.com:scikit-learn/scikit-learn.git --tags
</pre></div>
</div>
</li>
<li><p>Create the source tarball:</p>
<ul>
<li><p>Wipe clean your repo:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ git clean -xfd
</pre></div>
</div>
</li>
<li><p>Generate the tarball:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ python setup.py sdist
</pre></div>
</div>
</li>
</ul>
<p>The result should be in the <code class="docutils literal notranslate"><span class="pre">dist/</span></code> folder. We will upload it later
with the wheels. Check that you can install it in a new virtualenv and
that the tests pass.</p>
</li>
<li><p>Update the dependency versions and set <code class="docutils literal notranslate"><span class="pre">BUILD_COMMIT</span></code> variable to the
release tag at:</p>
<p><a class="reference external" href="https://github.com/MacPython/scikit-learn-wheels">https://github.com/MacPython/scikit-learn-wheels</a></p>
<p>Once the CI has completed successfully, collect the generated binary wheel
packages and upload them to PyPI by running the following commands in the
scikit-learn source folder (checked out at the release tag):</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ rm -r dist
$ pip install -U wheelhouse_uploader twine
$ python setup.py fetch_artifacts
</pre></div>
</div>
</li>
<li><p>Check the content of the <code class="docutils literal notranslate"><span class="pre">dist/</span></code> folder: it should contain all the wheels
along with the source tarball (“scikit-learn-XXX.tar.gz”).</p>
<p>Make sure that you do not have developer versions or older versions of
the scikit-learn package in that folder.</p>
<p>Upload everything at once to <a class="reference external" href="https://pypi.org">https://pypi.org</a>:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ twine upload dist/*
</pre></div>
</div>
</li>
<li><p>For major/minor (not bug-fix release), update the symlink for <code class="docutils literal notranslate"><span class="pre">stable</span></code>
and the <code class="docutils literal notranslate"><span class="pre">latestStable</span></code> variable in
<a class="reference external" href="https://github.com/scikit-learn/scikit-learn.github.io">https://github.com/scikit-learn/scikit-learn.github.io</a>:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ cd /tmp
$ git clone --depth 1 --no-checkout git@github.com:scikit-learn/scikit-learn.github.io.git
$ cd scikit-learn.github.io
$ echo stable &gt; .git/info/sparse-checkout
$ git checkout master
$ rm stable
$ ln -s 0.999 stable
$ sed -i &quot;s/latestStable = &#39;.*/latestStable = &#39;0.999&#39;;&quot; versionwarning.js
$ git commit -m &quot;Update stable to point to 0.999&quot; stable
$ git push origin master
</pre></div>
</div>
</li>
</ol>
<p>The following GitHub checklist might be helpful in a release PR:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">*</span> <span class="p">[</span> <span class="p">]</span> <span class="n">update</span> <span class="n">news</span> <span class="ow">and</span> <span class="n">what</span><span class="s1">&#39;s new date in master and release branch</span>
<span class="o">*</span> <span class="p">[</span> <span class="p">]</span> <span class="n">create</span> <span class="n">tag</span>
<span class="o">*</span> <span class="p">[</span> <span class="p">]</span> <span class="n">update</span> <span class="n">dependencies</span> <span class="ow">and</span> <span class="n">release</span> <span class="n">tag</span> <span class="n">at</span> <span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">github</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">MacPython</span><span class="o">/</span><span class="n">scikit</span><span class="o">-</span><span class="n">learn</span><span class="o">-</span><span class="n">wheels</span>
<span class="o">*</span> <span class="p">[</span> <span class="p">]</span> <span class="n">twine</span> <span class="n">the</span> <span class="n">wheels</span> <span class="n">to</span> <span class="n">PyPI</span> <span class="n">when</span> <span class="n">that</span><span class="s1">&#39;s green</span>
<span class="o">*</span> <span class="p">[</span> <span class="p">]</span> <span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">github</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">scikit</span><span class="o">-</span><span class="n">learn</span><span class="o">/</span><span class="n">scikit</span><span class="o">-</span><span class="n">learn</span><span class="o">/</span><span class="n">releases</span> <span class="n">draft</span>
<span class="o">*</span> <span class="p">[</span> <span class="p">]</span> <span class="n">confirm</span> <span class="n">bot</span> <span class="n">detected</span> <span class="n">at</span> <span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">github</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">conda</span><span class="o">-</span><span class="n">forge</span><span class="o">/</span><span class="n">scikit</span><span class="o">-</span><span class="n">learn</span><span class="o">-</span><span class="n">feedstock</span> <span class="ow">and</span> <span class="n">wait</span> <span class="k">for</span> <span class="n">merge</span>
<span class="o">*</span> <span class="p">[</span> <span class="p">]</span> <span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">github</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">scikit</span><span class="o">-</span><span class="n">learn</span><span class="o">/</span><span class="n">scikit</span><span class="o">-</span><span class="n">learn</span><span class="o">/</span><span class="n">releases</span> <span class="n">publish</span>
<span class="o">*</span> <span class="p">[</span> <span class="p">]</span> <span class="n">announce</span> <span class="n">on</span> <span class="n">mailing</span> <span class="nb">list</span>
<span class="o">*</span> <span class="p">[</span> <span class="p">]</span> <span class="p">(</span><span class="n">regenerate</span> <span class="n">Dash</span> <span class="n">docs</span><span class="p">:</span> <span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">github</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">Kapeli</span><span class="o">/</span><span class="n">Dash</span><span class="o">-</span><span class="n">User</span><span class="o">-</span><span class="n">Contributions</span><span class="o">/</span><span class="n">tree</span><span class="o">/</span><span class="n">master</span><span class="o">/</span><span class="n">docsets</span><span class="o">/</span><span class="n">Scikit</span><span class="p">)</span>
</pre></div>
</div>
</div>
<div class="section" id="the-scikit-learn-org-web-site">
<h2>The scikit-learn.org web site<a class="headerlink" href="#the-scikit-learn-org-web-site" title="Permalink to this headline">¶</a></h2>
<p>The scikit-learn web site (<a class="reference external" href="http://scikit-learn.org">http://scikit-learn.org</a>) is hosted at GitHub,
but should rarely be updated manually by pushing to the
<a class="reference external" href="https://github.com/scikit-learn/scikit-learn.github.io">https://github.com/scikit-learn/scikit-learn.github.io</a> repository. Most
updates can be made by pushing to master (for /dev) or a release branch
like 0.99.X, from which Circle CI builds and uploads the documentation
automatically.</p>
</div>
<div class="section" id="travis-cron-jobs">
<h2>Travis Cron jobs<a class="headerlink" href="#travis-cron-jobs" title="Permalink to this headline">¶</a></h2>
<p>From <a class="reference external" href="https://docs.travis-ci.com/user/cron-jobs">https://docs.travis-ci.com/user/cron-jobs</a>: Travis CI cron jobs work
similarly to the cron utility, they run builds at regular scheduled intervals
independently of whether any commits were pushed to the repository. Cron jobs
always fetch the most recent commit on a particular branch and build the project
at that state. Cron jobs can run daily, weekly or monthly, which in practice
means up to an hour after the selected time span, and you cannot set them to run
at a specific time.</p>
<p>For scikit-learn, Cron jobs are used for builds that we do not want to run in
each PR. As an example the build with the dev versions of numpy and scipy is
run as a Cron job. Most of the time when this numpy-dev build fail, it is
related to a numpy change and not a scikit-learn one, so it would not make sense
to blame the PR author for the Travis failure.</p>
<p>The definition of what gets run in the Cron job is done in the .travis.yml
config file, exactly the same way as the other Travis jobs. We use a <code class="docutils literal notranslate"><span class="pre">if:</span> <span class="pre">type</span>
<span class="pre">=</span> <span class="pre">cron</span></code> filter in order for the build to be run only in Cron jobs.</p>
<p>The branch targeted by the Cron job and the frequency of the Cron job is set
via the web UI at <a class="reference external" href="https://www.travis-ci.org/scikit-learn/scikit-learn/settings">https://www.travis-ci.org/scikit-learn/scikit-learn/settings</a>.</p>
</div>
<div class="section" id="experimental-features">
<h2>Experimental features<a class="headerlink" href="#experimental-features" title="Permalink to this headline">¶</a></h2>
<p>The <a class="reference internal" href="../modules/classes.html#module-sklearn.experimental" title="sklearn.experimental"><code class="xref py py-mod docutils literal notranslate"><span class="pre">sklearn.experimental</span></code></a> module was introduced in 0.21 and contains
experimental features / estimators that are subject to change without
deprecation cycle.</p>
<p>To create an experimental module, you can just copy and modify the content of
<a class="reference external" href="https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/experimental/enable_hist_gradient_boosting.py">enable_hist_gradient_boosting.py</a>,
or
<a class="reference external" href="https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/experimental/enable_iterative_imputer.py">enable_iterative_imputer.py</a>.</p>
<p>Note that the public import path must be to a public subpackage (like
<code class="docutils literal notranslate"><span class="pre">sklearn/ensemble</span></code> or <code class="docutils literal notranslate"><span class="pre">sklearn/impute</span></code>), not just a <code class="docutils literal notranslate"><span class="pre">.py</span></code> module.
Also, the (private) experimental features that are imported must be in a
submodule/subpackage of the public subpackage, e.g.
<code class="docutils literal notranslate"><span class="pre">sklearn/ensemble/_hist_gradient_boosting/</span></code> or
<code class="docutils literal notranslate"><span class="pre">sklearn/impute/_iterative.py</span></code>. This is needed so that pickles still work
in the future when the features aren’t experimental anymore</p>
<p>Please also write basic tests following those in
<a class="reference external" href="https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/experimental/tests/test_enable_hist_gradient_boosting.py">test_enable_hist_gradient_boosting.py</a>.</p>
<p>Make sure every user-facing code you write explicitly mentions that the feature
is experimental, and add a <code class="docutils literal notranslate"><span class="pre">#</span> <span class="pre">noqa</span></code> comment to avoid pep8-related warnings:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="c1"># To use this experimental feature, we need to explicitly ask for it:</span>
<span class="kn">from</span> <span class="nn">sklearn.experimental</span> <span class="kn">import</span> <span class="n">enable_hist_gradient_boosting</span>  <span class="c1"># noqa</span>
<span class="kn">from</span> <span class="nn">sklearn.ensemble</span> <span class="kn">import</span> <span class="n">HistGradientBoostingRegressor</span>
</pre></div>
</div>
<p>For the docs to render properly, please also import
<code class="docutils literal notranslate"><span class="pre">enable_my_experimental_feature</span></code> in <code class="docutils literal notranslate"><span class="pre">doc/conf.py</span></code>, else sphinx won’t be
able to import the corresponding modules. Note that using <code class="docutils literal notranslate"><span class="pre">from</span>
<span class="pre">sklearn.experimental</span> <span class="pre">import</span> <span class="pre">*</span></code> <strong>does not work</strong>.</p>
<p>Note that some experimental classes / functions are not included in the
<a class="reference internal" href="../modules/classes.html#module-sklearn.experimental" title="sklearn.experimental"><code class="xref py py-mod docutils literal notranslate"><span class="pre">sklearn.experimental</span></code></a> module: <code class="docutils literal notranslate"><span class="pre">sklearn.datasets.fetch_openml</span></code>.</p>
</div>
</div>


      </div>
    <div class="container">
      <footer class="sk-content-footer">
            &copy; 2007 - 2019, scikit-learn developers (BSD License).
          <a href="../_sources/developers/maintainer.rst.txt" rel="nofollow">Show this page source</a>
      </footer>
    </div>
  </div>
</div>
<script src="../_static/js/vendor/bootstrap.min.js"></script>

<script>
    window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
    ga('create', 'UA-22606712-2', 'auto');
    ga('set', 'anonymizeIp', true);
    ga('send', 'pageview');
</script>
<script async src='https://www.google-analytics.com/analytics.js'></script>


<script>
$(document).ready(function() {
    /* Add a [>>>] button on the top-right corner of code samples to hide
     * the >>> and ... prompts and the output and thus make the code
     * copyable. */
    var div = $('.highlight-python .highlight,' +
                '.highlight-python3 .highlight,' +
                '.highlight-pycon .highlight,' +
		'.highlight-default .highlight')
    var pre = div.find('pre');

    // get the styles from the current theme
    pre.parent().parent().css('position', 'relative');
    var hide_text = 'Hide prompts and outputs';
    var show_text = 'Show prompts and outputs';

    // create and add the button to all the code blocks that contain >>>
    div.each(function(index) {
        var jthis = $(this);
        if (jthis.find('.gp').length > 0) {
            var button = $('<span class="copybutton">&gt;&gt;&gt;</span>');
            button.attr('title', hide_text);
            button.data('hidden', 'false');
            jthis.prepend(button);
        }
        // tracebacks (.gt) contain bare text elements that need to be
        // wrapped in a span to work with .nextUntil() (see later)
        jthis.find('pre:has(.gt)').contents().filter(function() {
            return ((this.nodeType == 3) && (this.data.trim().length > 0));
        }).wrap('<span>');
    });

    // define the behavior of the button when it's clicked
    $('.copybutton').click(function(e){
        e.preventDefault();
        var button = $(this);
        if (button.data('hidden') === 'false') {
            // hide the code output
            button.parent().find('.go, .gp, .gt').hide();
            button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'hidden');
            button.css('text-decoration', 'line-through');
            button.attr('title', show_text);
            button.data('hidden', 'true');
        } else {
            // show the code output
            button.parent().find('.go, .gp, .gt').show();
            button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'visible');
            button.css('text-decoration', 'none');
            button.attr('title', hide_text);
            button.data('hidden', 'false');
        }
    });

	/*** Add permalink buttons next to glossary terms ***/
	$('dl.glossary > dt[id]').append(function() {
		return ('<a class="headerlink" href="#' +
			    this.getAttribute('id') +
			    '" title="Permalink to this term">¶</a>');
	});
  /*** Hide navbar when scrolling down ***/
  // Returns true when headerlink target matches hash in url
  (function() {
    hashTargetOnTop = function() {
        var hash = window.location.hash;
        if ( hash.length < 2 ) { return false; }

        var target = document.getElementById( hash.slice(1) );
        if ( target === null ) { return false; }

        var top = target.getBoundingClientRect().top;
        return (top < 2) && (top > -2);
    };

    // Hide navbar on load if hash target is on top
    var navBar = document.getElementById("navbar");
    var navBarToggler = document.getElementById("sk-navbar-toggler");
    var navBarHeightHidden = "-" + navBar.getBoundingClientRect().height + "px";
    var $window = $(window);

    hideNavBar = function() {
        navBar.style.top = navBarHeightHidden;
    };

    showNavBar = function() {
        navBar.style.top = "0";
    }

    if (hashTargetOnTop()) {
        hideNavBar()
    }

    var prevScrollpos = window.pageYOffset;
    hideOnScroll = function(lastScrollTop) {
        if (($window.width() < 768) && (navBarToggler.getAttribute("aria-expanded") === 'true')) {
            return;
        }
        if (lastScrollTop > 2 && (prevScrollpos <= lastScrollTop) || hashTargetOnTop()){
            hideNavBar()
        } else {
            showNavBar()
        }
        prevScrollpos = lastScrollTop;
    };

    /*** high preformance scroll event listener***/
    var raf = window.requestAnimationFrame ||
        window.webkitRequestAnimationFrame ||
        window.mozRequestAnimationFrame ||
        window.msRequestAnimationFrame ||
        window.oRequestAnimationFrame;
    var lastScrollTop = $window.scrollTop();

    if (raf) {
        loop();
    }

    function loop() {
        var scrollTop = $window.scrollTop();
        if (lastScrollTop === scrollTop) {
            raf(loop);
            return;
        } else {
            lastScrollTop = scrollTop;
            hideOnScroll(lastScrollTop);
            raf(loop);
        }
    }
  })();
});

</script>
    
<script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml.js"></script>
    
</body>
</html>